home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / program / szadb1_4.zoo / src / adb.c next >
C/C++ Source or Header  |  1991-07-07  |  23KB  |  1,171 lines

  1. /* Copyright (c) 1990 by Sozobon, Limited.  Authors: Johann Ruegg, Don Dugger
  2.  *
  3.  * Permission is granted to anyone to use this software for any purpose
  4.  * on any computer system, and to redistribute it freely, with the
  5.  * following restrictions:
  6.  * 1) No charge may be made other than reasonable charges for reproduction.
  7.  * 2) Modified versions must be clearly marked as such.
  8.  * 3) The authors are not responsible for any harmful consequences
  9.  *    of using this software, even if they result from defects in it.
  10.  *
  11.  *    adb.c
  12.  */
  13. /* 
  14.  * Modified to allow adb execute strings of commands stored in memory.
  15.  * Added buffered transcript output to named files.
  16.  * Changes in accepted request syntax.
  17.  * More elaborate command line.
  18.  *
  19.  *    Michal Jaegermann, May 1990
  20.  *
  21.  * Symbol table display is now paging - it was just too fast for TT.
  22.  * ('q', 'Q' or CNTLC will get you out - any other key continues)
  23.  *    Michal Jaegermann, July 1991
  24.  *
  25.  */
  26.  
  27. #include <setjmp.h>
  28. #include <fcntl.h>
  29. #include "adb.h"
  30.  
  31. #define IN_ADB
  32. #include "lang.h"
  33.  
  34. #define CNTLC    3
  35. #define CNTLS    0x13
  36. #define CNTLW    0x17
  37.  
  38. #define CHUNK   0x4000L;
  39. long _BLKSIZ = CHUNK;         /* granularity of memory allocation */
  40.  
  41. struct file     binary;
  42. int             swidth;      /* max width of symbol name - unknown so far */
  43.  
  44. long            dot;
  45. int             dotoff;
  46. long            olddot;
  47.  
  48. #define DOT    (dot+dotoff)
  49.  
  50. int             dotset;
  51. long            maxoff = 0x400;
  52. int             ibase = 10;
  53.  
  54. int             lastc = 0;
  55. char            sign = 0;
  56. long            bcount;
  57.  
  58. int             click = 0;    /* flag for cmdcol */
  59. extern int      write (), bf_write ();
  60. char            trname[LINESZ + 2];    /* transcript file name */
  61. int             trid = NO_TRANS;/* its descriptor       */
  62. w_buf          *trbuf = (w_buf *) 0;    /* pointer to its buffer */
  63. int             (*trout) () = write;
  64.  
  65. unsigned long   regbuf[19];
  66.  
  67. struct regs     regs[] = {
  68.               "pc", ®buf[16],
  69.               "sr", ®buf[17],
  70.               "xsp", ®buf[18],
  71.               "d0", ®buf[0],
  72.               "d1", ®buf[1],
  73.               "d2", ®buf[2],
  74.               "d3", ®buf[3],
  75.               "d4", ®buf[4],
  76.               "d5", ®buf[5],
  77.               "d6", ®buf[6],
  78.               "d7", ®buf[7],
  79.               "a0", ®buf[8],
  80.               "a1", ®buf[9],
  81.               "a2", ®buf[10],
  82.               "a3", ®buf[11],
  83.               "a4", ®buf[12],
  84.               "a5", ®buf[13],
  85.               "a6", ®buf[14],
  86.               "sp", ®buf[15],
  87.               "", 0,
  88. };
  89.  
  90. #define NREGS    19
  91.  
  92. jmp_buf         jmpb, trp_buf;
  93.  
  94. static char    cnbuf[LINESZ + 2];
  95. #define CONSOLE &cnbuf[0]
  96.  
  97. int             l_restart, w_restart, lb_cur, lb_fill;
  98. char           *lbuf = CONSOLE;
  99.  
  100. int             getkchr (), getschr ();
  101. static char    *csource;    /* location read by a function getschr() */
  102. static int      (*getachr) () = getkchr;
  103. extern int      print_regs;
  104. extern struct window w;
  105.  
  106. char          **bpt_cmds;
  107. char          **ftable;
  108.  
  109. _main ()
  110. {
  111.     extern int      _argc;
  112.     extern char   **_argv;
  113.  
  114.     main (_argc, _argv);
  115.     exit (0);
  116. }
  117.  
  118. main (argc, argv)
  119.     int             argc;
  120.     char           *argv[];
  121. {
  122.     char           *cp, c;
  123.     extern long     ossp;
  124.     int             i, no_cmds, no_buf;
  125.     void            adb (), copyargs (), kdefs (), free (), usage ();
  126.     char           *malloc ();
  127.  
  128.     winopen ();
  129.     *argv++;            /* skip starting argument */
  130.  
  131.     no_cmds = no_buf = 0;
  132.     while ('-' == **argv) {
  133.     (*argv)++;        /* skip dash */
  134.     while ('\0' != (c = ~' ' & **argv)) {
  135.         (*argv)++;        /* skip leading letter */
  136.         if ('N' == c) {
  137.         while ('\0' != (c = ~' ' & **argv)) {
  138.             if ('C' == c)
  139.             no_cmds = 1;
  140.             else if ('B' == c)
  141.             no_buf = 1;
  142.             else
  143.             usage ();
  144.             (*argv)++;    /* to next character */
  145.         }
  146.         break;        /* done with option */
  147.         }
  148.         else if ('K' == c) {
  149.         if ('\0' == **argv) {
  150.             if (0 == --argc)    /* out of arguments? */
  151.             usage ();
  152.             *argv++;
  153.         }
  154.         kdefs (*argv);    /* load definitions of fuction keys */
  155.         break;
  156.         }
  157.         else if ('O' == c) { /* tell which object format */
  158.         if ('\0' == **argv) {
  159.             if (0 == --argc)    /* out of arguments? */
  160.             usage ();
  161.             *argv++;
  162.         }
  163.         if ('M' == (~' ' & **argv))
  164.             swidth = 16;    /* this is MWC symbpl table */
  165.         else
  166.             swidth = 8;        /* we'll take anything else for DRI */
  167.         break;
  168.         }
  169.         else
  170.         usage ();
  171.     }            /* while ('\0' != (c = ~' ' & **argv)) */
  172.     if (0 == --argc)
  173.         usage ();
  174.     *argv++;        /* to next argument */
  175.     }                /* while ('-' == **argv) */
  176.     ibase = 16;
  177.  
  178.     if (0 == no_cmds) {
  179.     i = 0;
  180.     if ((char **) 0 != (bpt_cmds =
  181.                 (char **) malloc (MAXBPTS * sizeof(char *)))) {
  182.         while (i < MAXBPTS) {
  183.         if ((char *) 0 == (bpt_cmds[i] = malloc (LINESZ + 3)))
  184.             break;
  185.         i++;
  186.         }
  187.     }
  188.     if (i < MAXBPTS) {
  189.         prt ("not enough memory for breakpoint requests\n");
  190.         while (i > 0) {
  191.         --i;
  192.         free (bpt_cmds[i]);
  193.         }
  194.         if ((char **) 0 != bpt_cmds)
  195.         free (bpt_cmds);
  196.     }
  197.     }
  198.  
  199.     if (0 == no_buf) {        /* set write-to-file function to unbuffered
  200.                  * write */
  201.     if ((w_buf *) 0 ==
  202.         (trbuf = (w_buf *) malloc (sizeof (w_buf)))) {
  203.         prt (M7);        /* warning - transcript unbuffered */
  204.     }
  205.     else {
  206.         trbuf->buf_len = TRBUFSZ;
  207.         trbuf->buffered = 0;
  208.         trout = bf_write;
  209.     }
  210.     }
  211.  
  212.     binary.symptr = 0;
  213. /*    binary.flags = 0; */
  214.     if (0 == --argc) {
  215.     usage ();
  216.     }
  217.     binary.name = *argv++;
  218.  
  219.     if ((binary.fid = open (binary.name, 0)) < 0) {
  220. /*        prtf("%s:cannot open\n", binary.name);    */
  221.     prtf (M1, binary.name);
  222.     seeerr ();
  223.     exit (2);
  224.     }
  225.     if (setobj () != 0) {
  226. /*        prtf("%s:bad format\n", binary.name);    */
  227.     prtf (M2, binary.name);
  228.     seeerr ();
  229.     exit (3);
  230.     }
  231.     if (loadpcs () != 0) {
  232. /*        prtf("%s:bad pexec\n", binary.name);    */
  233.     prtf (M3, binary.name);
  234.     seeerr ();
  235.     exit (4);
  236.     }
  237.     close (binary.fid);
  238.     copyargs (--argc, argv);    /* if any left - copy for a process to debug */
  239.  
  240.     relsym ();
  241.     vects ();
  242. /*    prt("Szadb version 1.2 (english)\n");    */
  243.     prt (M4);
  244.     if (setjmp (trp_buf)) {
  245.     seeerr ();
  246.     exit (0);
  247.     }
  248.     adb (1);
  249. }
  250.  
  251. void
  252. usage ()
  253. {
  254. /*    prtf ("Usage: adb [-nb] [-nc] [-k kdefs] [-o(s|m)] binary [args]\n"); */
  255.     prtf (M_USE);
  256.     seeerr ();
  257.     exit (1);
  258. }
  259.  
  260. exit (n)
  261. {
  262.     void            trclose ();
  263.  
  264.     oldvects ();
  265.     winclose ();
  266.     trclose ();
  267.     _exit (n);
  268. }
  269.  
  270. seeerr ()
  271. {
  272. /*    prt("(hit any key)");    */
  273.     prt (M5);
  274.     gemdos (7);
  275. }
  276.  
  277. #define MWC_START   0x2a6f0004
  278.  
  279. setobj ()
  280. {
  281.     struct fheader  hdr;
  282.     long            guess;
  283.     int             fid = binary.fid;
  284.  
  285.     if ((read (fid, &hdr, sizeof (hdr)) != sizeof (hdr)) &&
  286.                         (MAGIC != hdr.magic))
  287.     return -1;
  288.     /* an empty MWC symbol table may use 0x30 bytes for something (?) */
  289.     if ((hdr.ssize) && (0x30L != hdr.ssize)) {
  290.         if (sizeof(long) != read(fid, &guess, sizeof(long)))
  291.         return -1;
  292.     if (0 == swidth) { /* nobody told what is the format */
  293.         swidth = (MWC_START == guess ? 16 : 8);
  294.     }
  295.     lseek (fid, hdr.tsize + hdr.dsize - (long)(sizeof(long)), 1);
  296.     if (16 == swidth)
  297.         return mwsetsym (fid, hdr.ssize);
  298.     else {
  299.         if (extndsymb(fid, hdr.ssize))
  300.         swidth = 22;
  301.         return setsym (fid, hdr.ssize);
  302.     }
  303.     }
  304.     return 0;
  305. }
  306.  
  307. void
  308. adb (top)
  309.     int             top;
  310. {
  311.     int             cmddol (), cmdcol (), cmdprt ();
  312.     int             cmdwrt (), cmdsreg (), null ();
  313.     long            getn (), getdot ();
  314.     long            expr ();
  315.     int             intr ();
  316.     register int    c, lc;
  317.     register long   count;
  318.     int             (*f) ();
  319.     long            (*g) ();
  320.     char            fmt[LINESZ];
  321.  
  322.     if (top) {
  323.     f = cmdprt;
  324.     g = getdot;
  325.     lc = '=';
  326.     fmt[0] = 'a';
  327.     fmt[1] = '\n';
  328.     fmt[2] = '\0';
  329.     setjmp (jmpb);
  330.     }
  331.  
  332.     for (;;) {
  333.     dotoff = 0;
  334.     if (type (c = PEEKC) & (ALPHANUM | SPECX)) {
  335.         dot = expr ();
  336.         olddot = dot;
  337.         dotset = 1;
  338.     }
  339.     else
  340.         dotset = 0;
  341.     if (PEEKC == ',') {
  342.         nb ();        /* consume pushed comma */
  343.         count = expr ();
  344.     }
  345.     else
  346.         count = 1L;
  347.  
  348.     switch (c = nb ()) {
  349.     case '>':
  350.         f